﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main1()
{
	char a = -1;// 有符号的char
	signed char b = -1;  
	unsigned char c = -1;
	//判断输出是 ？
	//要明白数据是以补码形式存储在计算机里面
	//以原码形式把数据打印出来
	// 1000 0000 0000 0001 a的原码
	// 1111 1111 1111 1110 a的反码
	// 1111 1111 1111 1111 a的补码
	
	// 1111 1111 1111 1111 b的补码
	
	// 0000 0000 0000 0001 c 原码
	// 1111 1111 1111 1110 c 反码
	// 1111 1111 1111 1111 c 补码
	
	// %d 是以十进制的形式打印有符号整数
	// 因为a,b 都是有符号整数，所以需要进行整形提升 同时又发生数据的截断
	// char a: 1111 提升之后对应的补码（提升规则：char 提升为int :高位以符号位来补充）
	//1111 1111 1111 1111 
	//1111 1111 1111 1110 反码
	//1000 0000 0000 0001 原码 a:-1

	//signed char b: 1111 提升：1111 1111 1111 1111 
	// 1111 1111 1111 1110  反码：b
	// 1000 0000 0000 0001 原码：b -1

	// unsigned char c: 11111111 无符号char 提升为有符号int 以0来补充  0000 0000 1111 1111
	//对应的补码 0000 0000 1111 1111 最高位是0，说明为整数，所以原反补码一样
	printf("a=%d,b=%d,c=%d", a, b, c);//-1  -1 255
	return 0;
}
int main2()
{
	//char a = -128;
	//// %u 以十进制形式打印无符号的整形数据:会直接把内存里面对应的补码当成无符号数据
	//// 10000000 00000000 1000 0000 -128:原码
	//// 11111111 11111111 0111 1111 反码
	//// 1111111 11111111 1000 0000 补码
	////数据截断 1000 0000 char a：C语言默认为-128
	//// 11111111 11111111 1000 0000 对应补码，原码，反码
	//printf("%u\n", a);
	return 0;
}
int main()
{
	int i = -20;// 1 0100
	// 对应原码  11111111 111111111 11111111 00010100
	// 1000000 0000 0000 0000 0000 11101011
	// 1000000 0000 0000 0000 0000 11101100 补码

	unsigned int j = 10;
	// 原反补：0000 0000 0000 0000 0000 0000 0000 1010
	//对应补码相加 10000000 0000 0000 0000 0000 11110110
	printf("%d\n",j + i);//-10
	return 0;
}